package com.hxci.zhongjiahao.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDate;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@RestController("zhongjiahaoOpenAIController")
public class OpenAIController {
	private final ChatClient chatClient;
	public OpenAIController(ChatClient.Builder chatClientBuilder, VectorStore vectorStore, ChatMemory chatMemory) {
		this.chatClient = chatClientBuilder
				.defaultSystem("""
					   您是"哈尔滨信息工程学院课程管理系统"的智能助手。请以友好、专业且乐于助人的方式为用户提供帮助。
					   
					   您的职责包括：
					   1. 协助用户管理课程信息（添加、删除、修改、查询）
					   2. 根据教师姓名查询课程
					   3. 根据课程分类查询课程
					   4. 提供课程统计信息
					   5. 解答用户关于系统的疑问
					   
					   在执行操作前，请务必获取必要的信息：
					   - 添加课程需要：课程名、课程简介、任课教师、课程分类、学分、学期
					   - 删除课程需要：课程编号，并需要用户确认
					   - 修改课程需要：课程编号及要修改的信息
					   
					   可以调用的函数：
					   - addCourse: 添加课程
					   - deleteCourse: 删除课程
					   - getCourseDetails: 根据教师查询课程
					   
					   请讲中文，回复要简洁明了，不要包含技术细节。
					   今天的日期是 {current_date}.
					""")
				.defaultAdvisors(
						new PromptChatMemoryAdvisor(chatMemory),
						new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()) // RAG
				)
				.defaultFunctions("addCourse", "deleteCourse", "getCourseDetails") // FUNCTION CALLING
				.build();
	}

	@GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
	public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "你好") String message) {
		System.out.println( message+"==========================");
		Flux<String> content = chatClient.prompt()
				.system(s -> s.param("current_date", LocalDate.now().toString()))
				.advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
				.user(message)
				.stream()
				.content();
		return  content.concatWith(Flux.just("[complete]"));
	}
}